package com.atguigu.gmall.cart.config;

import com.atguigu.gmall.cart.bean.CartInfo;
import com.atguigu.gmall.cart.mapper.CartInfoMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.BoundListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.List;

@Component
public class CartTask {
    private static Logger logger = LoggerFactory.getLogger(CartTask.class);
    @Autowired
    CartInfoMapper cartInfoMapper;
    @Autowired
    RedisTemplate redisTemplate;
    //spring task 只支持6位的cron表达式
    //  秒  分 时 日 月 周 年
    //  秒：0/5  从0秒开始  每过5秒执行一次
//    @Scheduled(cron = "0/5 * * * * ?")
//    public void test(){
//        System.out.println(Thread.currentThread().getName()+" .. "+new Date());
//    }
    //demo 任务
    @XxlJob("test1JobHandler") // 注解中的值表示该任务注册到调度中心的任务名称
    public ReturnT<String> demoJobHandler(String param) throws Exception {
       // XxlJobLogger.log("XXL-JOB, Hello World. : "+ param);
        logger.info("param: "+ param);
        XxlJobLogger.log("XXL-JOB, Hello World. : "+ param);
        return ReturnT.SUCCESS;
    }
    /*
        定时任务定期 删除userKey的购物车数据
                如果一个购物项是用户未登录的数据并且 创建时间超过30天 删除数据
                每天凌晨4:00

                select
                * from cart_info
                where is_login = 1
                and  gmt_create <= '2022-08-30'
     */
    @XxlJob("clearUnloginCartJobHandler") // 注解中的值表示该任务注册到调度中心的任务名称
    public ReturnT<String> clearUnloginCartJobHandler(String param) throws Exception {
        // XxlJobLogger.log("XXL-JOB, Hello World. : "+ param);
        String date = new DateTime().minusDays(30).toString("yyyy-MM-dd");
        cartInfoMapper.delete(new LambdaQueryWrapper<CartInfo>()
            .eq(CartInfo::getLogin , false)
           .le(CartInfo::getGmtCreate ,date ));
        return ReturnT.SUCCESS;
    }

    //获取redis中 数据库操作失败的用户id集合(redis操作成功  但是数据库数据失败 数据不一致)
    //
    @XxlJob("asyncCartJobHandler") // 注解中的值表示该任务注册到调度中心的任务名称
    public ReturnT<String> asyncCartJobHandler(String param) throws Exception {
        BoundListOperations ops = redisTemplate.boundListOps("cart:failed");
        while(ops.size()!=0){
            //从右获取最先存入的用户id
            String userId = ops.rightPop().toString();
            System.out.println("ops.size() = " + ops.size());
            //同步userId的数据
            //1、先删除数据库userId的数据
            cartInfoMapper.delete(new LambdaQueryWrapper<CartInfo>()
                    .eq(CartInfo::getUserId , userId));
            //2、再查询该用户redis中的购物车数据 同步到数据库中
            BoundHashOperations hashOps = redisTemplate.boundHashOps("cart:" + userId);
            List<CartInfo> cartInfos = hashOps.values();
            if(!CollectionUtils.isEmpty(cartInfos)){
                cartInfos.forEach(cartInfo -> {
                    cartInfoMapper.insert(cartInfo);
                });
            }
        }
        return ReturnT.SUCCESS;
    }
}
